-- ------------------------------------------
-- CambiarEstado
-- Se cambia el estado de un partido.
-- ------------------------------------------

CREATE OR REPLACE FUNCTION CambiarEstado(param_idPartido partidos.idPartido%TYPE)
RETURNS void AS $$

        DECLARE
                partido partidos%ROWTYPE;
                nuevoEstado partidos.idPartido%TYPE;
                equipoLocal equipos%ROWTYPE;
                equipoVisita equipos%ROWTYPE;

	BEGIN
                -- Estado actual
                SELECT INTO partido * FROM partidos WHERE idPartido = param_idPartido;

		-- Excepciones
                IF (partido IS NULL) THEN
                    RAISE EXCEPTION 'El partido no existe';
                END IF;

                IF (partido.estado = 5) THEN
                    RAISE EXCEPTION 'El partido ya termino, no hay siguiente estado';
                END IF;

                -- Calcular sgte estado
                nuevoEstado := partido.estado + 1;

                -- Si estan empatando y el partido define que equipo pasa y nuevoEstado = 5 (finalizado)
                -- entonces deben irse a penales (nuevoEstado := 6).
                IF (nuevoEstado = 5 AND
                    partido.esClasificatorio AND
                    Goles(param_idPartido, 'visita') = Goles(param_idPartido, 'local')) THEN

                        nuevoEstado := 6;
                END IF;

                -- En caso de finalizado se debe ademas:
                -- Actualizar partidosJugados, partidosGanados, partidosEmpatados
                -- Actualizar resultado
                IF (nuevoEstado = 5) THEN

                    SELECT INTO equipoLocal * FROM equipos WHERE idEquipo = partido.idEquipoLocal;
                    SELECT INTO equipoVisita * FROM equipos WHERE idEquipo = partido.idEquipoVisita;
                    

                    -- Gana visita:
                    IF (Goles(param_idPartido, 'visita') > Goles(param_idPartido, 'local')) THEN

                        UPDATE equipos SET partidosJugados = equipoVisita.partidosJugados + 1,
                                           partidosGanados = equipoVisita.partidosGanados + 1
                                     WHERE idEquipo = equipoVisita.idEquipo;

                        UPDATE equipos SET partidosJugados = equipoLocal.partidosJugados + 1
                                     WHERE idEquipo = equipoLocal.idEquipo;

                        UPDATE partidos SET resultado = 2 WHERE idPartido = param_idPartido;

                    -- Gana local:
                    ELSIF (Goles(param_idPartido, 'visita') < Goles(param_idPartido, 'local')) THEN

                        UPDATE equipos SET partidosJugados = equipoLocal.partidosJugados + 1,
                                           partidosGanados = equipoLocal.partidosGanados + 1
                                     WHERE idEquipo = equipoVisita.idEquipo;

                        UPDATE equipos SET partidosJugados = equipoVisita.partidosJugados + 1
                                     WHERE idEquipo = equipoVisita.idEquipo;

                        UPDATE partidos SET resultado = 1 WHERE idPartido = param_idPartido;

                    -- Empate:
                    ELSE

                        UPDATE equipos SET partidosJugados   = equipoVisita.partidosJugados + 1,
                                           partidosEmpatados = equipoVisita.partidosEmpatados + 1
                                     WHERE idEquipo = equipoVisita.idEquipo;

                        UPDATE equipos SET partidosJugados   = equipoLocal.partidosJugados + 1,
                                           partidosEmpatados = equipoLocal.partidosEmpatados + 1
                                     WHERE idEquipo = equipoVisita.idEquipo;

                        UPDATE partidos SET resultado = 3 WHERE idPartido = param_idPartido;

                    END IF;

                END IF;



                -- Finalmente realizar update al sgte estado
               UPDATE partidos SET estado = nuevoEstado WHERE idPartido = param_idPartido;

	END;

$$ LANGUAGE plpgsql